﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model.Instance;
using MySql.Data.MySqlClient;

namespace l1cs.server.datatables
{
    public class ChatLogTable
    {
        private static Logger _log = Logger.getLogger( typeof( ChatLogTable ).FullName );

        /*
         * コード的にはHashMapを利用すべきだが、パフォーマンス上の問題があるかもしれない為、配列で妥協。
         * HashMapへの変更を検討する場合は、パフォーマンス上問題が無いか十分注意すること。
         */
        private bool[] loggingConfig = new bool[15];

        private ChatLogTable()
        {
            loggingConfig[0] = Config.LOGGING_CHAT_NORMAL;
            loggingConfig[1] = Config.LOGGING_CHAT_WHISPER;
            loggingConfig[2] = Config.LOGGING_CHAT_SHOUT;
            loggingConfig[3] = Config.LOGGING_CHAT_WORLD;
            loggingConfig[4] = Config.LOGGING_CHAT_CLAN;
            loggingConfig[11] = Config.LOGGING_CHAT_PARTY;
            loggingConfig[13] = Config.LOGGING_CHAT_COMBINED;
            loggingConfig[14] = Config.LOGGING_CHAT_CHAT_PARTY;
        }

        private static ChatLogTable _instance;

        public static ChatLogTable getInstance()
        {
            if ( _instance == null )
            {
                _instance = new ChatLogTable();
            }
            return _instance;
        }

        private bool isLoggingTarget( int type )
        {/*TTOK*/
            return loggingConfig[type];
        }

        /// <summary>
        /// プレイヤーのチャットをDBに保存する。
        /// </summary>
        /// <param name="pc">プレイヤー</param>
        /// <param name="target">チャット対象</param>
        /// <param name="text">内容</param>
        /// <param name="type">チャット種類</param>
        public void storeChat( L1PcInstance pc, L1PcInstance target, String text, int type )
        {/*TTOK*/
            if ( !isLoggingTarget( type ) )
            {
                return;
            }
            using ( MySqlWrapper wrapper = new MySqlWrapper() )
            {
                MySqlCommand cmd;
                // type
                // 0:通常チャット
                // 1:Whisper
                // 2:叫び
                // 3:全体チャット
                // 4:血盟チャット
                // 11:パーティチャット
                // 13:連合チャット
                // 14:チャットパーティ
                if ( target != null )
                {
                    String sqlstr = @"INSERT INTO log_chat SET 
                                        account_name          = ?1 ,
                                        char_id               = ?2 ,
                                        name                  = ?3 ,
                                        clan_id               = ?4 ,
                                        clan_name             = ?5 ,
                                        locx                  = ?6 ,
                                        locy                  = ?7 ,
                                        mapid                 = ?8 ,
                                        type                  = ?9 ,
                                        target_account_name   = ?10,
                                        target_id             = ?11,
                                        target_name           = ?12,
                                        target_clan_id        = ?13,
                                        target_clan_name      = ?14,
                                        target_locx           = ?15,
                                        target_locy           = ?16,
                                        target_mapid          = ?17,
                                        content               = ?18,
                                        datetime              = SYSDATE()";
                    cmd = new MySqlCommand( sqlstr );
                    cmd.Parameters.Add( "?1", MySqlDbType.String ).Value = pc.getAccountName();
                    cmd.Parameters.Add( "?2", MySqlDbType.Int32 ).Value = pc.getId();
                    cmd.Parameters.Add( "?3", MySqlDbType.String ).Value = pc.isGm() ? "******" : pc.getName();
                    cmd.Parameters.Add( "?4", MySqlDbType.Int32 ).Value = pc.getClanid();
                    cmd.Parameters.Add( "?5", MySqlDbType.String ).Value = pc.getClanname();
                    cmd.Parameters.Add( "?6", MySqlDbType.Int32 ).Value = pc.getX();
                    cmd.Parameters.Add( "?7", MySqlDbType.Int32 ).Value = pc.getY();
                    cmd.Parameters.Add( "?8", MySqlDbType.Int32 ).Value = pc.getMapId();
                    cmd.Parameters.Add( "?9", MySqlDbType.Int32 ).Value = type;
                    cmd.Parameters.Add( "?10", MySqlDbType.String ).Value = target.getAccountName();
                    cmd.Parameters.Add( "?11", MySqlDbType.Int32 ).Value = target.getId();
                    cmd.Parameters.Add( "?12", MySqlDbType.String ).Value = target.getName();
                    cmd.Parameters.Add( "?13", MySqlDbType.Int32 ).Value = target.getClanid();
                    cmd.Parameters.Add( "?14", MySqlDbType.String ).Value = target.getClanname();
                    cmd.Parameters.Add( "?15", MySqlDbType.Int32 ).Value = target.getX();
                    cmd.Parameters.Add( "?16", MySqlDbType.Int32 ).Value = target.getY();
                    cmd.Parameters.Add( "?17", MySqlDbType.Int32 ).Value = target.getMapId();
                    cmd.Parameters.Add( "?18", MySqlDbType.String ).Value = text;
                }
                else
                {
                    String sqlstr = @"INSERT INTO log_chat SET
                                        account_name = ?1 ,
                                        char_id      = ?2 ,
                                        name         = ?3 ,
                                        clan_id      = ?4 ,
                                        clan_name    = ?5 ,
                                        locx         = ?6 ,
                                        locy         = ?7 ,
                                        mapid        = ?8 ,
                                        type         = ?9 ,
                                        content      = ?10,
                                        datetime     = SYSDATE()";
                    cmd = new MySqlCommand( sqlstr );
                    cmd.Parameters.Add( "?1", MySqlDbType.String ).Value = pc.getAccountName();
                    cmd.Parameters.Add( "?2", MySqlDbType.Int32 ).Value = pc.getId();
                    cmd.Parameters.Add( "?3", MySqlDbType.String ).Value = pc.isGm() ? "******" : pc.getName();
                    cmd.Parameters.Add( "?4", MySqlDbType.Int32 ).Value = pc.getClanid();
                    cmd.Parameters.Add( "?5", MySqlDbType.String ).Value = pc.getClanname();
                    cmd.Parameters.Add( "?6", MySqlDbType.Int32 ).Value = pc.getX();
                    cmd.Parameters.Add( "?7", MySqlDbType.Int32 ).Value = pc.getY();
                    cmd.Parameters.Add( "?8", MySqlDbType.Int32 ).Value = pc.getMapId();
                    cmd.Parameters.Add( "?9", MySqlDbType.Int32 ).Value = type;
                    cmd.Parameters.Add( "?10", MySqlDbType.String ).Value = text;
                }
                wrapper.ExecNonQuery( cmd );
            }
        }
    }
}

